package it.unisa.unibox.junit.storage;

import it.unisa.unibox.Storage.DBUtilityQuerys;
import it.unisa.unibox.beans.AreaScientifica;
import it.unisa.unibox.beans.Dipartimento;
import it.unisa.unibox.beans.Prodotto;
import it.unisa.unibox.beans.Ricercatore;

import java.sql.SQLException;
import java.util.ArrayList;

import junit.framework.TestCase;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class DBUtilityQuerysTest extends TestCase {

	DBUtilityQuerys db;
	ArrayList<AreaScientifica> areaList;
	ArrayList<Dipartimento> dipList;
	ArrayList<Ricercatore> ricList;
	ArrayList<Prodotto> prodList;
	int idRicercatore;
	int idProdotto;
	int idArea;
	int idDip;
	int idRic;

	@Override
	@Before
	public void setUp() throws Exception {
		super.setUp();
		db = DBUtilityQuerys.getInstance();
		areaList = null;
		dipList = null;
		ricList = null;
		prodList = null;
		idRicercatore = 1;
		idProdotto = 1;
		idArea = 1;
		idDip = 1;
		idRic = 1;
	}

	@Override
	@After
	public void tearDown() throws Exception {
		// TODO Auto-generated method stub
		super.tearDown();
	}

	@Test
	public void testGetAreeScientifiche() {
		try {
			areaList = db.getAreeScientifiche();
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertNotNull(areaList);
		assertFalse(areaList.isEmpty());
		for (AreaScientifica a : areaList) {
			assertNotNull(a);
			assertNotNull(a.getNome());
			assertNotNull(a.toString());
			assertTrue(a.getId() > 0);
		}
	}

	@Test
	public void testGetDipartimenti() {
		try {
			dipList = db.getDipartimenti();
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertNotNull(dipList);
		assertFalse(dipList.isEmpty());
		for (Dipartimento d : dipList) {
			assertNotNull(d);
			assertNotNull(d.getNome());
			assertNotNull(d.toString());
			assertTrue(d.getId() > 0);
		}
	}

	@Test
	public void testGetListaAutori() {
		try {
			ricList = db.getListaAutori(idProdotto);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertNotNull(ricList);
		assertFalse(ricList.isEmpty());
		for (Ricercatore r : ricList) {
			assertNotNull(r);
			assertNotNull(r.getNome());
			assertNotNull(r.getCittaNascita());
			assertNotNull(r.getCodFisc());
			assertNotNull(r.getCognome());
			assertNull(r.getAccount());// da errore!
			assertTrue(r.getRuolo() >= 1 && r.getRuolo() <= 5);
			assertNotNull(r.toString());
			assertTrue(r.getId() > 0);
		}
	}

	@Test
	public void testGetProdottiHome() {
		try {
			prodList = db.getProdottiHome(idRicercatore);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
		assertNotNull(prodList);
		assertFalse(prodList.isEmpty());
		for (Prodotto p : prodList) {
			assertNotNull(p);
			// assertNotNull(p.getAbstract_field());
			assertNotNull(p.getLingua());
			//assertNotNull(p.getNote());
			assertNotNull(p.getTipologia());
			assertNotNull(p.getTitolo());
			assertTrue(p.getId() > 0);
			assertTrue(p.getStato() >= 1 && p.getStato() <= 6);
			assertNotNull(p.getResponsabile());
		}
	}

	@Test
	public void testRetrieveAreaScientifica() {

		try {
			AreaScientifica a = db.retrieveAreaScientifica(idArea);
			assertNotNull(a);
			assertNotNull(a.getNome());
			assertNotNull(a.toString());
			assertTrue(a.getId() > 0);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}
	}

	@Test
	public void testRetrieveDipartimento() {
		try {
			Dipartimento d = db.retrieveDipartimento(idDip);
			assertNotNull(d);
			assertNotNull(d.getNome());
			assertNotNull(d.toString());
			assertTrue(d.getId() > 0);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}

	}

	@Test
	public void testRetrieveRicercatore() {
		try {
			Ricercatore r = db.retrieveRicercatore(idRic);
			assertNotNull(r);
			assertNotNull(r.getCittaNascita());
			assertNotNull(r.getCodFisc());
			assertNotNull(r.getCognome());
			assertNotNull(r.getDataInizioServizio());
			assertNotNull(r.getDataNascita());
			assertNotNull(r.getEmail());
			assertNotNull(r.getNome());
			assertNotNull(r.getSesso());
			assertNull(r.getAccount()); // l'account non deve essere inserito
			assertNotNull(r.getAreaScientifica());
			assertNotNull(r.getDipartimento());
			assertTrue(r.getId() > 0);
			assertTrue(r.getRuolo() > 0);
		} catch (SQLException e) {
			fail();
			e.printStackTrace();
		}

	}
}
